package com.intelligent.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.intelligent.pojo.BomInfo;
import com.intelligent.service.BomInfoService;
import com.intelligent.utils.ExcelUtils;
import com.intelligent.utils.Result;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * BOM管理接口
 * 提供BOM的新增、查询、分页查询与Excel导出功能。
 */
@RestController
@RequestMapping("/bomInfo")
public class BomInfoController {

    @Resource
    private BomInfoService bomInfoService;

    /**
     * 新增BOM信息（自动生成BOM编号）
     *
     * @param bomInfo BOM信息实体
     * @return 是否新增成功
     */
    @PostMapping("/add")
    public Result<Boolean> add(@RequestBody BomInfo bomInfo) {
        boolean success = bomInfoService.addBomInfo(bomInfo);
        return success ? Result.success(true) : Result.error("新增失败", false);
    }

    /**
     * 更新BOM信息
     *
     * @param bomInfo BOM信息实体
     * @return 是否更新成功
     */
    @PutMapping("/update")
    public Result<Boolean> update(@RequestBody BomInfo bomInfo) {
        boolean success = bomInfoService.updateBomInfo(bomInfo);
        return success ? Result.success(true) : Result.error("更新失败", false);
    }

    /**
     * 根据ID删除BOM信息
     *
     * @param bomId BOM ID
     * @return 是否删除成功
     */
    @DeleteMapping("/{bomId}")
    public Result<Boolean> delete(@PathVariable Long bomId) {
        boolean success = bomInfoService.deleteBomInfo(bomId);
        return success ? Result.success(true) : Result.error("删除失败", false);
    }

    /**
     * 根据ID查询BOM信息（含产品与单位名称关联信息）
     *
     * @param bomId BOM ID
     * @return BOM信息
     */
    @GetMapping("/{bomId}")
    public Result<BomInfo> getById(@PathVariable Long bomId) {
        BomInfo bomInfo = bomInfoService.getBomInfoById(bomId);
        return bomInfo != null ? Result.success(bomInfo) : Result.error("BOM信息不存在", null);
    }

    /**
     * 分页查询BOM信息（含产品与单位名称关联信息）
     *
     * @param pageNo 页码，默认1
     * @param pageSize 每页数量，默认10
     * @param bomCode 按BOM编码模糊查询（可选）
     * @param bomName 按BOM名称模糊查询（可选）
     * @param productCode 按产品编码模糊查询（可选）
     * @param productName 按产品名称模糊查询（可选）
     * @param status 按状态精确查询（可选）
     * @return 分页数据
     */
    @GetMapping("/page")
    public Result<IPage<BomInfo>> page(@RequestParam(defaultValue = "1") long pageNo,
                                       @RequestParam(defaultValue = "10") long pageSize,
                                       @RequestParam(required = false) String bomCode,
                                       @RequestParam(required = false) String bomName,
                                       @RequestParam(required = false) String productCode,
                                       @RequestParam(required = false) String productName,
                                       @RequestParam(required = false) Integer status) {
        Page<BomInfo> page = new Page<>(pageNo, pageSize);
        IPage<BomInfo> result = bomInfoService.pageBomInfo(page, bomCode, bomName, productCode, productName, status);
        return Result.success(result);
    }

    /**
     * 导出BOM信息列表为Excel（含产品与单位名称）
     *
     * @param response HTTP响应对象
     * @param bomCode 按BOM编码模糊查询（可选）
     * @param bomName 按BOM名称模糊查询（可选）
     * @param productCode 按产品编码模糊查询（可选）
     * @param productName 按产品名称模糊查询（可选）
     * @param status 按状态精确查询（可选）
     * @throws IOException IO异常
     */
    @GetMapping("/export")
    public void export(HttpServletResponse response,
                       @RequestParam(required = false) String bomCode,
                       @RequestParam(required = false) String bomName,
                       @RequestParam(required = false) String productCode,
                       @RequestParam(required = false) String productName,
                       @RequestParam(required = false) Integer status) throws IOException {
        List<BomInfo> list = bomInfoService.exportBomInfoToExcel(bomCode, bomName, productCode, productName, status);

        String[] headers = {"BOM ID", "BOM编号", "BOM名称", "产品名称", "产品编码", "规格", "分类", "单位名称", "状态"};

        ExcelUtils.exportToExcel(response, "bom_info", "BOM信息", headers, list, bom -> new Object[]{
                bom.getBomId(),
                bom.getBomCode(),
                bom.getBomName(),
                bom.getProductName(),
                bom.getProductCode(),
                bom.getSpecification(),
                bom.getCategory(),
                bom.getUnitName(),
                bom.getStatus()
        });
    }


    /**
     * 将任意对象安全转换为CSV单元文本（空值返回空串）。
     *
     * @param v 任意对象
     * @return CSV安全文本
     */
    private String nv(Object v) {
        return v == null ? "" : csvSafe(String.valueOf(v));
    }

    /**
     * CSV安全转义：当文本包含逗号、换行或双引号时，包裹双引号并对双引号进行转义。
     *
     * @param s 原始文本
     * @return CSV安全文本
     */
    private String csvSafe(String s) {
        if (s == null) {
            return "";
        }
        boolean needQuotes = s.contains(",") || s.contains("\n") || s.contains("\r") || s.contains("\"");
        String escaped = s.replace("\"", "\"\"");
        return needQuotes ? "\"" + escaped + "\"" : escaped;
    }
}
